package dataframe

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object DataFrame_FinalDemo04 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local[*]")
    conf.setAppName("DataFrame_FinalDemo04")

    val spark: SparkSession = SparkSession
      .builder()
      .config(conf)
      .getOrCreate()
    import spark.implicits._

    val authorsDF = Seq(
      Author("曹雪芹", "清代", "1724年"),
      Author("施耐庵", "元末明初", "1296年"),
      Author("罗贯中", "元末明初", null),
      Author("吴承恩", null, null)
    ).toDF()
    authorsDF.printSchema()
    authorsDF.show()

    // 删除带有缺失值的行
    val df1 = authorsDF.na.drop()
    df1.show()

    // 删除带有至少两个缺失值的行
    val df2 = authorsDF.na.drop(2)
    df2.show()

    // 使用一个给定的字符串填充所有缺失的值
    authorsDF.na.fill("不详").show()

    // 可以在每一列使用一个给定的字符串填充缺失值
    authorsDF.na.fill(Map("dynasty" -> "朝代不明", "dob" -> "出生不详")).show()

    // 删除重复的值,删除完全重复的行
    val authorsDF1 = Seq(
      Author("曹雪芹", "清代", "1724年"),
      Author("曹雪芹", "清代", "1724年"),
      Author("施耐庵", "元末明初", "1296年"),
      Author("曹雪芹", "清朝", "1724年"),
      Author("罗贯中", "元末明初", null),
      Author("吴承恩", null, null)
    ).toDF()
    authorsDF1.show()
    authorsDF1.dropDuplicates().show()

    // 删除指定的列重复的行（基于一个列的子集删除重复）
    authorsDF1.dropDuplicates("name").show()

    // 删除指定的多个列重复的行（基于一个子集删除重复）
    authorsDF1.dropDuplicates(Array("dynasty", "dob")).show()


    spark.stop()
  }

  case class Author(name: String, dynasty: String, dob: String)

}
